package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class MedidaAlimento extends Entidade {
    public static final String DATABASE_TABLE = "medida_alimento";
    public static final String TABLE_CREATE = " create table medida_alimento "//
            + "(id integer primary key autoincrement, "//
            + "id_medida integer not null, " + //
            "id_alimento integer not null, " + //
            "medida_grama float not null," + //
            "FOREIGN KEY(id_medida) REFERENCES medida(id)," + //
            "FOREIGN KEY(id_alimento) REFERENCES alimento(id)); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "id_medida", "id_alimento", "medida_grama" };
    private int id;
    private Integer idMedida;
    private Integer idAlimento;
    private Float medidaGrama;
    private Medida medida;
    private Alimento alimento;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Integer getIdMedida() {
        return idMedida;
    }

    public void setIdMedida(Integer idMedida) {
        this.idMedida = idMedida;
    }

    public Integer getIdAlimento() {
        return idAlimento;
    }

    public void setIdAlimento(Integer idAlimento) {
        this.idAlimento = idAlimento;
    }

    public Float getMedidaGrama() {
        return medidaGrama;
    }

    public void setMedidaGrama(Float medidaGrama) {
        this.medidaGrama = medidaGrama;
    }

    public Medida getMedida(Activity atividade) {
        if (idMedida == null) {
            return null;
        } else if (this.medida != null && idMedida == this.medida.getId()) {
            return medida;
        } else {
            this.medida = new Medida();
            this.medida.setId(this.idMedida);
            this.medida = Medida.consultar(atividade, this.medida);
            return Medida.consultar(atividade, this.medida);
        }
    }

    public Alimento getAlimento(Activity atividade) {
        if (idAlimento == null) {
            return null;
        } else if (this.alimento != null && idAlimento == this.alimento.getId()) {
            return alimento;
        } else {
            this.alimento = new Alimento();
            this.alimento.setId(this.idAlimento);
            this.alimento = Alimento.consultar(atividade, this.alimento);
            return Alimento.consultar(atividade, this.alimento);
        }
    }

    public static Long incluir(Activity atividade, MedidaAlimento medidaAlimento) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {
            ContentValues values = toContentValues(medidaAlimento);
            id = dao.inserir(DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, MedidaAlimento medidaAlimento) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValues(medidaAlimento);
        dao.atualizar(DATABASE_TABLE, medidaAlimento.getId(), values);

    }

    public static void excluir(Activity atividade, MedidaAlimento medidaAlimento) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, medidaAlimento.getId());
    }

    public static MedidaAlimento consultar(Activity atividade, MedidaAlimento medidaAlimento) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, medidaAlimento.getId());
        medidaAlimento = cursorParaMedidaAlimento(cursor);
        return medidaAlimento;
    }

    private static MedidaAlimento cursorParaMedidaAlimento(Cursor cursor) {
        // Se o cursor está vazio, retorna nulo
        if (cursor.getCount() == 0) {
            return null;
        }
        MedidaAlimento medidaAlimento = new MedidaAlimento();
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int idMedidaColumn = cursor.getColumnIndex("id_medida");
        int idAlimentoColumn = cursor.getColumnIndex("id_alimento");
        int medidaGramaColumn = cursor.getColumnIndex("medida_grama");
        medidaAlimento.setId(cursor.getInt(idColumn));
        medidaAlimento.setIdAlimento(cursor.getInt(idAlimentoColumn));
        medidaAlimento.setIdMedida(cursor.getInt(idMedidaColumn));
        medidaAlimento.setMedidaGrama(cursor.getFloat(medidaGramaColumn));

        return medidaAlimento;
    }

    public static List<MedidaAlimento> listar(Activity atividade, MedidaAlimento medidaAlimento) {
        Cursor cursor = null;
        List<MedidaAlimento> list = new ArrayList<MedidaAlimento>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {
            cursor = dao.get(DATABASE_TABLE, COLUMNS);
            if (cursor != null && cursor.moveToFirst()) {
                int count = cursor.getCount();
                for (int i = 0; i < count; i++) {
                    MedidaAlimento medidaAlimentoRet = cursorParaMedidaAlimento(cursor);

                    list.add(medidaAlimentoRet);
                    cursor.moveToNext();
                }
            }
        }
        return list;
    }

    private static ContentValues toContentValues(MedidaAlimento medidaAlimento) {
        ContentValues values = new ContentValues();
        values.put("id_alimento", medidaAlimento.getIdAlimento());
        values.put("id_medida", medidaAlimento.getIdMedida());
        values.put("medida_grama", medidaAlimento.getMedidaGrama());
        return values;
    }

    @Override
    public String toString() {
        return idMedida + "-" + idAlimento + "-" + medidaGrama;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    public static MedidaAlimento consultarChaveUnica(Activity atividade, MedidaAlimento medidaAlimento) {
        String sql = "SELECT * FROM medida_alimento WHERE " + //
                " id_alimento = " + medidaAlimento.getIdAlimento() + //
                " AND id_medida =" + medidaAlimento.getIdMedida();
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.getComQuery(sql, null);
        medidaAlimento = cursorParaMedidaAlimento(cursor);
        return medidaAlimento;
    }

}
